home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / util / gnu / a2_0b_Emacs_sr.lha / Emacs-19.25 / lib-src / make-path.c < prev    next >
C/C++ Source or Header  |  1993-05-23  |  2KB  |  88 lines

  1. /* Make all the directories along a path.
  2.    Copyright (C) 1992 Free Software Foundation, Inc.
  3.  
  4. This file is part of GNU Emacs.
  5.  
  6. GNU Emacs is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 1, or (at your option)
  9. any later version.
  10.  
  11. GNU Emacs is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU Emacs; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. /* This program works like mkdir, except that it generates
  21.    intermediate directories if they don't exist.  This is just like
  22.    the `mkdir -p' command on most systems; unfortunately, the mkdir
  23.    command on some of the purer BSD systems (like Mt. Xinu) don't have
  24.    that option. */
  25.  
  26. #include <sys/types.h>
  27. #include <sys/stat.h>
  28. #include <stdio.h>
  29. #include <errno.h>
  30.  
  31. extern int errno;
  32.  
  33. char *prog_name;
  34.  
  35. int touchy_mkdir (path)
  36.      char *path;
  37. {
  38.   struct stat buf;
  39.  
  40.   /* If PATH already exists and is a directory, return success.  */
  41.   if (stat (path, &buf) >= 0
  42.       && (buf.st_mode & S_IFMT) == S_IFDIR)
  43.     return 0;
  44.  
  45.   /* Otherwise, try to make it.  If PATH exists but isn't a directory,
  46.      this will signal an error.  */
  47.   if (mkdir (path, 0777) < 0)
  48.     {
  49.       fprintf (stderr, "%s: ", prog_name);
  50.       perror (path);
  51.       return -1;
  52.     }
  53.  
  54.   return 0;
  55. }
  56.  
  57. int
  58. main (argc, argv)
  59.      int argc;
  60.      char **argv;
  61. {
  62.   prog_name = *argv;
  63.  
  64.   for (argc--, argv++; argc > 0; argc--, argv++)
  65.     {
  66.       char *path = *argv;
  67.       int i;
  68.  
  69.       /* Stop at each slash in path and try to create the directory.
  70.      Skip any initial slash.  */
  71.       for (i = (path[0] == '/') ? 1 : 0; path[i]; i++)
  72.     if (path[i] == '/')
  73.       {
  74.         path[i] = '\0';
  75.         if (touchy_mkdir (path) < 0)
  76.           goto next_pathname;
  77.         path[i] = '/';
  78.       }
  79.  
  80.       touchy_mkdir (path);
  81.  
  82.     next_pathname:
  83.       ;
  84.     }
  85.  
  86.   return 0;
  87. }
  88.